package envio;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.joda.time.DateTime;

import clientes.Cliente;
import productos.Presentacion;

public class Envio {

	private Map<Presentacion, Integer> productosContenidos;
	private DateTime fechaEnvio;
	private Cliente cliente;
	private EstadoEnvio estadoEnvio;
	private Boolean abonado;

	public Envio(Map<Presentacion, Integer> productos, DateTime fechaEnvio) {
		this.productosContenidos = productos;
		this.fechaEnvio = fechaEnvio;
		this.estadoEnvio = new Pendiente();
		this.abonado = false;
	}

	public Map<Presentacion, Integer> productos() {
		return this.productosContenidos;
	}

	public void setFecha(DateTime fecha) {
		this.fechaEnvio = fecha;

	}

	public DateTime getFechaEnvio() {
		return this.fechaEnvio;
	}

	public void setCliente(Cliente clienteQueRecibe) {
		this.cliente = clienteQueRecibe;

	}

	public Cliente getCliente() {
		return this.cliente;
	}

	public Map<Presentacion, Integer> getProductos() {
		return this.productosContenidos;
	}

	public boolean pendiente() {
		return this.estadoEnvio.pendiente();
	}

	public void setEnvioPendiente() {
		this.estadoEnvio.setEnvioPendiente(this);

	}

	public void setEstado(EstadoEnvio estado) {
		this.estadoEnvio = estado;

	}

	public boolean cancelado() {
		return this.estadoEnvio.cancelado();
	}

	public boolean enProceso() {
		return this.estadoEnvio.enProceso();
	}

	public boolean entregado() {
		return this.estadoEnvio.entregado();
	}

	public boolean reprogramado() {
		return this.estadoEnvio.reprogramado();
	}

	public boolean sinStock() {
		return this.estadoEnvio.sinStock();
	}

	public void setEnvioCancelado() {
		this.estadoEnvio.setEnvioCancelado(this);
	}

	public void setEnvioEnProceso() {
		this.estadoEnvio.setEnvioEnProceso(this);
	}

	public void setEnvioEntregado() {
		this.estadoEnvio.setEnvioEntregado(this);
	}

	public void setEnvioReprogramado() {
		this.estadoEnvio.setEnvioReprogramado(this);
	}

	public void setEnvioSinStock() {
		this.estadoEnvio.setEnvioSinStock(this);
	}

	public boolean checkEnvioPosible() {
		Boolean resultado = true;

		for (Entry<Presentacion, Integer> tuplaPresentacionInteger : this
				.productos().entrySet()) {
			if (!tuplaPresentacionInteger.getKey().stockDisponible(
					tuplaPresentacionInteger.getValue())) {

				resultado = false;
			}

		}
		return resultado;
	}

	public void completarEnvio() {
		this.setEnvioEntregado();

	}

	public Boolean abonado() {
		return this.abonado;
	}


	public void agregarseComoObservadorAStock() {
		
		for (Presentacion presentacionelement : this.productosContenidos.keySet()) {
			presentacionelement.agregarEnvioComoObservadorAStock(this);
		}
		
	}


	public void setAbonado() {
		this.abonado = true;
	}


	public void avisarACliente() {
		this.getCliente().tuPedidoPuedeSerResuelto();
	}


}
